* */ use app\models\Assignment; use app\models\Recording; use app\models\Submission; use app\models\AssignmentRecording; use app\models\SubmissionRecording; use app\models\ReviewLog; use app\models\Review; class AssignmentController extends BaseController { //protected $layout = 'home.home'; public function create() { $assignment = Assignment::find(\Session::get('assignment_id')); return $this->_addEditAssignment($assignment); } public function cancel() { \Session::forget('assignment_id'); return \Redirect::route('home'); } private function _addEditAssignment($assignment = 0) { $assignment = $assignment instanceof Assignment ? $assignment : Assignment::find($assignment); $recording = new Recording(); $twilio = $recording->setupTwilio(); $twilio->clientName = str_random(5); if (\Request::getMethod() == 'POST') { $rules = array( 'name' => array('required'), 'due_timestamp' => array('required'), ); if (!\Input::has('recording_id')) { $rules['description'] = array('required'); } $validator = \Validator::make(\Input::all(), $rules); if ($validator->fails()) { return \Redirect::route('assignment.create')->withInput()->withErrors($validator); } else { $data = \Input::all(); if (!$assignment) { $assignment = new Assignment; $assignment->url_guid = $assignment->createUrlGuid(); } $assignment->name = $data['name']; $assignment->response_type = $data['response_type']; $assignment->due_timestamp = $this->_convertDatetime($data['due_timestamp'].' '.$data['time'].$data['timezone'], 'Y-m-d H:i:s'); $assignment->description = $data['description']; if ($assignment->save()) { if ($data['recording_id']) { $assignmentRecording = AssignmentRecording::where('recording_id', $data['recording_id'])->first(); if (!$assignmentRecording) { $assignmentRecording = new AssignmentRecording(); } $assignmentRecording->assignment_id = $assignment->id; $assignmentRecording->recording_id = $data['recording_id']; $assignmentRecording->save(); } \Session::put('assignment_id', $assignment->id); return \Redirect::route('assignment.preview'); } } } $record = null; if ($assignment) { //$assignment->time = $this->_convertDatetime($assignment->due_timestamp, 'G:i'); $assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'Y-m-d H:i:sP'); if (count($assignment->recordings)) { foreach ($assignment->recordings as $r) { $record = $r; } } } return \View::make('assignment.create', array( 'assignment' => !empty($assignment) ? $assignment : new Assignment(), 'twilio' => $twilio, 'recording' => $record, )); } public function preview() { $assignment = Assignment::find(\Session::get('assignment_id')); if (\Request::getMethod() == 'POST') { if ($assignment) { if ($assignment->publish()) { return \Redirect::route('assignment.share'); } } } if ($assignment) { //$assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'F j\, Y \b\y g:ia'); $assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'Y-m-d H:i:sP'); $assignment->description = $this->getAudioByTag($assignment->description); return \View::make('assignment.preview', array('assignment' => $assignment)); } else { return \Redirect::route('home'); } } public function share() { $assignment = Assignment::find(\Session::get('assignment_id')); if (\Request::getMethod() == 'POST') { if ($assignment) { \Session::forget('assignment_id'); return \Redirect::route('home'); } } if ($assignment) { if ($assignment->is_published) { return \View::make('assignment.share', array('assignment' => $assignment)); } else { return \Redirect::route('assignment.preview'); } } else { return \Redirect::route('home'); } } public function view($urlGuid) { $assignment = Assignment::where('url_guid', $urlGuid)->first(); if ($assignment && $assignment->is_published) { //$assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'F j\, Y \b\y g:ia'); $assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'Y-m-d H:i:sP'); if (\Request::isMethod('post')) { $personData = \Input::all(); $personData['person_guid'] = Submission::createPersonGuid(); $cookie = \Cookie::make('person_data', $personData); if (\Input::has('remember')) { $cookie = \Cookie::forever('person_data', $personData); } /* if ($personData['user_type'] == 'teacher') { return \Redirect::route('assignment.review', array($urlGuid, 'teacher'))->withCookie($cookie); } elseif ($personData['user_type'] == 'student') { return \Redirect::route('assignment.submission', $urlGuid)->withCookie($cookie); } else { return \Redirect::route('assignment.review', array($urlGuid, 'student'))->withCookie($cookie); } */ return \Redirect::route('assignment.view', $urlGuid)->withCookie($cookie); } return \View::make('assignment.view', array('assignment' => $assignment)); } else { return \Redirect::route('home'); } } public function submission($urlGuid) { $assignment = Assignment::where('url_guid', $urlGuid)->first(); if ($assignment && $assignment->is_published) { $personData = \Cookie::get('person_data'); if (!$personData) { return \Redirect::route('assignment.view', $urlGuid); } if (\Request::isMethod('post')) { $submission = new Submission(); $submission->assignment_id = $assignment->id; $submission->person_guid = $personData['person_guid']; $submission->first_name = $personData['first_name']; $submission->last_name = $personData['last_name']; $submission->answer = \Input::has('answer') ? \Input::get('answer') : ''; if ($submission->save()) { if (\Input::has('record')) { $submission->recordings()->attach(\Input::get('record')); /* $submissionRecording = new SubmissionRecording(); $submissionRecording->submission_id = $submission->id; $submissionRecording->recording_id = \Input::get('record'); $submissionRecording->save(); */ } return \Redirect::route('assignment.view', $urlGuid); } } //$assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'F j\, Y \b\y g:ia'); $assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'Y-m-d H:i:sP'); $assignment->description = $this->getAudioByTag($assignment->description); $recording = new Recording(); $twilio = $recording->setupTwilio(); $twilio->clientName = str_random(5); return \View::make('assignment.submission', array( 'assignment' => $assignment, 'firstName' => $personData['first_name'], 'twilio' => $twilio )); } else { return \Redirect::route('home'); } } public function review($urlGuid, $type) { if (!$urlGuid || !$type) { return \Redirect::route('home'); } $assignment = Assignment::where('url_guid', $urlGuid)->first(); if ($assignment && $assignment->is_published) { $personData = \Cookie::get('person_data'); if (!$personData) { return \Redirect::route('assignment.view', $urlGuid); } //$assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'F j\, Y \b\y g:ia'); $assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'Y-m-d H:i:sP'); $submissionList = Submission::where('assignment_id', $assignment->id)->get(); return \View::make('assignment.review', array( 'assignment' => $assignment, 'firstName' => $personData['first_name'], 'submissionList' => $submissionList, 'reviewerType' => $type, )); } else { return \Redirect::route('home'); } } public function reviewSubmission($urlGuid, $submissionId, $type) { if (!$urlGuid || !$submissionId || !$type) { return \Redirect::route('home'); } $assignment = Assignment::where('url_guid', $urlGuid)->first(); if ($assignment && $assignment->is_published) { $personData = \Cookie::get('person_data'); if (!$personData) { return \Redirect::route('assignment.view', $urlGuid); } if (\Request::getMethod() == 'POST') { $review = new Review(); $review->submission_id = $submissionId; $review->reviewer_type = $type; $review->reviewer_person_guid = $personData['person_guid']; $review->reviewer_first_name = $personData['first_name']; $review->reviewer_last_name = $personData['last_name']; $review->comment = \Input::has('feedback') ? \Input::get('feedback') : ''; if ($review->save()) { if (\Input::has('record_id')) { $review->recordings()->attach(\Input::get('record_id')); } } } else { $reviewLog = ReviewLog::where('submission_id', $submissionId) ->where('reviewer_person_guid', $personData['person_guid']) ->first(); if (!count($reviewLog)) { $reviewLog = new ReviewLog(); $reviewLog->submission_id = $submissionId; $reviewLog->reviewer_person_guid = $personData['person_guid']; $reviewLog->reviewer_first_name = $personData['first_name']; $reviewLog->reviewer_last_name = $personData['last_name']; $reviewLog->save(); } } //$assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'F j\, Y \b\y g:ia'); $assignment->due_timestamp = $this->_convertDatetime($assignment->due_timestamp, 'Y-m-d H:i:sP'); $submissionList = Submission::where('assignment_id', $assignment->id)->get(); $submission = Submission::find($submissionId); $reviewedNumber = $submission->countSubmissionReviewed($submission->person_guid, $submission->created_at); foreach ($submissionList as $sm) { if ($sm->id == $submissionId) { $sm->selected = 'selected'; } } $reviews = Review::where('submission_id', $submissionId)->get(); $recording = new Recording(); $twilio = $recording->setupTwilio(); $twilio->clientName = str_random(5); return \View::make('assignment.review', array( 'assignment' => $assignment, 'firstName' => $personData['first_name'], 'submissionList' => $submissionList, 'reviewerType' => $type, 'submission' => $submission, 'reviewedNumber' => $reviewedNumber, 'reviews' => $reviews, 'twilio' => $twilio, )); } else { return \Redirect::route('home'); } } public function getAudioByTag($content){ preg_match_all('/{AUDIO\:.*?\}/', $content, $matches); $arr1 = array(); $arr2 = array(); if (!empty($matches[0])) { foreach ($matches[0] as $match) { preg_match_all('/{(.*?)\}/', $match, $data); if (!empty($data[1][0])) { $recordId = substr(strstr($data[1][0], ':', false), 1); $recording = Recording::find($recordId); $arr1[] = $match; $arr2[] = ''; } } } return str_replace($arr1, $arr2, $content); } private function _convertDatetime($timestamp, $format) { $date = new \DateTime($timestamp); $date->setTimeZone(new \DateTimeZone("UTC")); return $date->format($format); } }